#include "SaveDataTimer.h"

SaveDataTimer::SaveDataTimer()
	: running(false), interval_ms(120000), flag_duration_ms(50000) {
	for (int i = 0; i < SaveDataTimer_flagNumber; ++i) {
		flag[i].store(false);  // 初始化所有通道的标志为 false
		flagSetTime[i] = std::chrono::steady_clock::now();  // 初始化时间戳
	}
}

SaveDataTimer::~SaveDataTimer()
{
	Stop();  // 析构时确保定时器停止
}

bool SaveDataTimer::Start()
{
	if (running) return false;  // 防止定时器已经启动时再次启动

	running = true;

	// 启动定时器线程
	std::thread([this]() {
		while (running) {
			TimerCallback();
			std::this_thread::sleep_for(std::chrono::milliseconds(10));  // 每次循环等待 10 毫秒
		}
		}).detach();  // 分离线程，避免阻塞主线程

	return true;
}

void SaveDataTimer::Stop()
{
	running = false;  // 停止定时器
}

void SaveDataTimer::TimerCallback()
{
	auto now = std::chrono::steady_clock::now();
	auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - start_time).count();

	if (elapsed >= interval_ms) {
		// 如果间隔时间到了，开始设置标志
		for (int i = 0; i < SaveDataTimer_flagNumber; ++i) {
			if (!flag[i].load()) {  // 只有当标志为 false 时才设置为 true
				flag[i].store(true);
				flagSetTime[i] = now;  // 记录当前通道的设置时间
				std::cout << "Channel " << i << " flag set to true at: " << elapsed << " ms" << std::endl;
			}
		}

		// 记录上次触发时间
		start_time = now;
	}

	// 检查每个通道的标志是否超时，并重置为 false
	for (int i = 0; i < SaveDataTimer_flagNumber; ++i) {
		if (flag[i].load() && std::chrono::duration_cast<std::chrono::milliseconds>(now - flagSetTime[i]).count() >= flag_duration_ms) {
			// 如果标志是 true 且已持续超过 flag_duration_ms，则重置标志
			flag[i].store(false);
			std::cout << "Channel " << i << " flag set to false at: " << elapsed << " ms" << std::endl;
		}
	}
}
